package com.example.mydemo.config;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;


//  请求日志记录切面
@Order(1)
@Aspect
@Component
public class LogRequestAspect {

    private static final Logger log = LoggerFactory.getLogger(LogRequestAspect.class);

    /**
     * 连接点 将CarService接口的所有实现类中的方法作为接入点，绑定到carRun（）上。
     * execution 中字符发解释
     * 1.第一个 * 任意返回值
     * 2.中间的是包名
     * 3.第二个*表示server包下的所有对象
     * 4.括号表示接收参数
     * 5.括号中的..表示任意参数
     *
     * execution 绑定这一个
     * 还有 ：execution  within  this  target  args  @target  @args   @within  @annotation
     */
    @Pointcut("execution(public * com.example.mydemo.controller..*.*(..))")
    public void carRun(){

    }

    /**
     * carRun() 就是上面的接入点。
     * @Before  表示在CarService接口的所有实现类中的方法，执行前将执行runBefore()方法
     */
    @Before("carRun()")
    public void runBefore(){
        System.out.println("runBefore()执行前执行了！！！！！");
    }

    /**
     * 之后执行
     */
    @After("carRun()")
    public void runAfter(){
        System.out.println("runAfter()执行前执行了！！！！！");
    }


    /**
     * 一部分run（）之前执行，一部分run（）之后执行
     * 这个需要特别注意
     */
    @Around("carRun()")
    public void runAround(ProceedingJoinPoint pj) throws Throwable {
        System.out.println("run()执行---前---执行了runAround（）！！！！！！");

        //如果添加了环绕增强，一定要加下面这句，不然远方法都将不执行。
        //执行被增强方法
        pj.proceed();
        System.out.println("run()执行---后---执行了runAround（）！！！！！！");
    }

    /**
     * run（）***方法返回后***执行
     */
    @AfterReturning("carRun()")
    public void runAfterReturning(){
        System.out.println("runAfterReturning()执行了！！！！！！");
    }

}
